package com.chapter.sample.jvm.gc.escape;

/**
 * 逃逸分析
 * <p>
 * 如何快速的判断是否发送了逃逸分析，就看new的对象实体是否有可能在方法外被调用
 */
public class EscapeAnalysis {
    public EscapeAnalysis obj;

    /**
     * 方法返回EscapeAnalysis对象，发送逃逸分析
     * @return
     */
    public EscapeAnalysis getInstance() {
        return obj == null ? new EscapeAnalysis() : obj;
    }

    /**
     * 为成员变量赋值，发送逃逸
     */
    public void setObj(){
        this.obj = new EscapeAnalysis();
    }
    //思考：如果当前的obj引用声明为static的，会发送逃逸吗？ 会


    /**
     * 对象的作用域仅在当前方法中有效，没有发生逃逸
     */
    public void useEscapeAnalysis(){
        EscapeAnalysis e = new EscapeAnalysis();
    }

    /**
     * 引用变量的值发生逃逸
     */
    public void useEscapeAnalysis1(){
        EscapeAnalysis e = getInstance();
    }

    /**
     * 也发生了逃逸
     * @param e
     */
    public void operate(EscapeAnalysis e){
        //e
    }
}
